﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace 死锁
{

    /**
        ○ 同一进程内，在同一时间，只有一个线程获取锁，占用一个资源或一段代码，使用lock或Monitor.Enter/Monitor.Exit
        ○ 同一进程或不同进程内，在同一时间，只有一个线程获取锁，占用一个资源或一段代码，使用Mutex
        ○ 同一进程或不同进程内，在同一时间，规定有限的线程占有一个资源或一段代码，使用Semaphore
        ○ 使用线程锁的时候要注意造成线程死锁，当线程持有锁的时间过长，容易造成线程死锁
    **/

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("准备转账了");

            Account accountA = new Account(1, 5000);

            Account accountB = new Account(2, 3000);


            AccountManager accountManagerA = new AccountManager(accountA, accountB, 1000);

            Thread threadA = new Thread(accountManagerA.Transfer);

            threadA.Name = "线程A";


            AccountManager accountManagerB = new AccountManager(accountB, accountA, 2000);

            Thread threadB = new Thread(accountManagerB.Transfer);

            threadB.Name = "线程B";


            threadA.Start();

            threadB.Start();


            threadA.Join();

            threadB.Join();

            Console.WriteLine("转账完成");




        }
    }
}
